"""
窗口计算相关性系统的平均值可以用于衡量两个时间序列之间的相关性程度，
比如通过计算两个时间序列的相关性，可以预测它们未来的变化趋势。
例如，如果两个股票的相关性很高，那么它们未来的价格变动很可能是相似的。

本例中，我们来用 pandas 实现此操作。
"""
import pandas as pd
import pandas._testing as tm
import numpy as np

np.random.seed(0)

df = tm.makeTimeDataFrame(5)  # df.shape[0] = 5
print(df)
"""
需求需要得到移动窗口大小为 4 的 Spearman 相关性系数的平均值，组成一个新的 DataFrame，由源数据分析可知道满足的共有两个窗口，共两行数据。
                   A         B         C         D
2000-01-03  1.764052 -0.977278  0.144044  0.333674
2000-01-04  0.400157  0.950088  1.454274  1.494079
2000-01-05  0.978738 -0.151357  0.761038 -0.205158
2000-01-06  2.240893 -0.103219  0.121675  0.313068
2000-01-07  1.867558  0.410599  0.443863 -0.854096
"""

"""
可以先利用 DataFrame 的 rolling() 方法构造移动窗口，
然后迭代计算每个窗口的相关性系数矩阵的平均值，每个窗口产生一个 Series，
最后将这些 Series 拼接为一个需求中需要的 DataFrame。

"""
# 先计算每个窗口的数据，并将它们存入列表中。
data = []
for i in df.rolling(4):
    if len(i) == 4:
        foo = i.corr(method="spearman").mean().rename(i.index[-1])
        # print(foo)
        data.append(foo)
# print(data)

"""
代码应用了 DataFrame 滚动窗口函数 rolling()，其作用是对 DataFrame 进行滚动窗口计算。

代码的逻辑如下：

    对于 DataFrame df 的每个滚动窗口，执行以下操作：
    
    检查该滚动窗口的长度是否为 4，如果是，则执行以下操作：
    
    计算该滚动窗口内所有列的 Spearman 相关系数矩阵，并取平均值，得到一个标量值 foo。
    
    将 foo 以 i.index[-1] （窗口底部索引）为标签添加到列表 data 中。
    
因此，代码的作用是计算 DataFrame df 中所有长度为 4 的滚动窗口的列之间的 Spearman 相关系数矩阵的平均值，并将结果存储在一个列表 data 中。
"""

# 最后，将这个元素为 Series 的列表构造为一个 DataFrame：
df = pd.DataFrame(data)
print(df)